package annotation.com.itheima.reflect.context;

import com.itheima.reflect.context.ApplicationContext;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class ClasspathApplicationContext implements ApplicationContext {

    // 定义一个容器存储系统中可能使用到的对象
    private ConcurrentHashMap<String, Object> beans = new ConcurrentHashMap<>();

    // 定义构造方法
    public ClasspathApplicationContext(String fileName) {

        // 1、读取xml配置文件并解析，获取注解扫描路径，将该路径下的被@Component注解标注的类的对象加入到对象容器中
        createBeanProcesser(fileName) ;

        // 2、对beans中的对象的标注有@Autowired注解的成员变量进行赋值
        initBeanProcesses() ;

    }

    // 对beans中的对象的标注有@Autowired注解的成员变量进行赋值
    private void initBeanProcesses() {

        // 补全代码

    }

    // 读取xml配置文件并解析，获取注解扫描路径，将该路径下的被@Component注解标注的类的对象加入到对象容器中
    private void createBeanProcesser(String fileName) {

        // 补全代码

    }

    @Override
    public <T> T getBean(Class<T> clazz) {

        // 遍历beans集合
        Collection<Object> values = beans.values();
        for(Object obj : values) {
            if(clazz == obj.getClass()) {       // 判断Class类型是否相当，如果是直接返回该对象即可
                return (T)obj ;
            }
        }

        return null;
    }

}
